#!/usr/bin/env python3
"""
AI动画生成系统主程序入口
支持文本到动画生成、风格迁移、视频编辑等功能
"""

import argparse
import sys
import os
from pathlib import Path

# 添加项目根目录到Python路径
project_root = Path(__file__).parent
sys.path.insert(0, str(project_root))

from src.models.text2video import TextToVideoGenerator
from src.models.style_transfer import StyleTransfer
from src.models.video_editing import VideoEditor
from src.utils.video_utils import VideoProcessor
from src.utils.text_utils import TextProcessor
from src.web.gradio_app import create_gradio_app
from src.api.fastapi_app import create_fastapi_app
import uvicorn


def setup_directories():
    """创建必要的目录结构"""
    directories = [
        "data/input",
        "data/output", 
        "data/temp",
        "models",
        "logs",
        "configs"
    ]
    
    for directory in directories:
        Path(directory).mkdir(parents=True, exist_ok=True)
        print(f"✓ 创建目录: {directory}")


def text2video_command(args):
    """文本到动画生成命令"""
    print("🎬 开始文本到动画生成...")
    
    generator = TextToVideoGenerator()
    
    # 生成视频
    output_path = generator.generate(
        prompt=args.prompt,
        style=args.style,
        duration=args.duration,
        fps=args.fps,
        resolution=args.resolution,
        output_path=args.output
    )
    
    print(f"✅ 视频生成完成: {output_path}")


def style_transfer_command(args):
    """风格迁移命令"""
    print("🎨 开始风格迁移...")
    
    transfer = StyleTransfer()
    
    # 执行风格迁移
    output_path = transfer.transfer(
        input_path=args.input,
        style=args.style,
        strength=args.strength,
        output_path=args.output
    )
    
    print(f"✅ 风格迁移完成: {output_path}")


def video_edit_command(args):
    """视频编辑命令"""
    print("✂️ 开始视频编辑...")
    
    editor = VideoEditor()
    
    # 执行视频编辑
    output_path = editor.edit(
        input_path=args.input,
        operations=args.operations,
        output_path=args.output,
        **vars(args)
    )
    
    print(f"✅ 视频编辑完成: {output_path}")


def batch_process_command(args):
    """批量处理命令"""
    print("🔄 开始批量处理...")
    
    processor = VideoProcessor()
    
    # 批量处理
    results = processor.batch_process(
        input_dir=args.input_dir,
        output_dir=args.output_dir,
        style=args.style,
        operations=args.operations
    )
    
    print(f"✅ 批量处理完成，共处理 {len(results)} 个文件")


def web_ui_command(args):
    """启动Web界面"""
    print("🌐 启动Web界面...")
    
    app = create_gradio_app()
    
    # 启动Gradio应用
    app.launch(
        server_name=args.host,
        server_port=args.port,
        share=args.share,
        debug=args.debug
    )


def api_server_command(args):
    """启动API服务器"""
    print("🚀 启动API服务器...")
    
    app = create_fastapi_app()
    
    # 启动FastAPI服务器
    uvicorn.run(
        app,
        host=args.host,
        port=args.port,
        workers=args.workers,
        reload=args.reload
    )


def demo_command(args):
    """运行演示"""
    print("🎭 运行演示...")
    
    # 创建演示数据
    demo_data = {
        "text2video": {
            "prompt": "一只可爱的小猫在花园里玩耍",
            "style": "cartoon",
            "duration": 3.0
        },
        "style_transfer": {
            "input": "data/input/demo_video.mp4",
            "style": "anime",
            "strength": 0.8
        },
        "video_edit": {
            "input": "data/input/demo_video.mp4",
            "operations": ["trim", "resize"],
            "start": 0,
            "end": 5
        }
    }
    
    # 运行演示
    for demo_type, params in demo_data.items():
        print(f"\n📹 演示 {demo_type}:")
        print(f"参数: {params}")
        
        # 这里可以调用相应的处理函数
        # 实际实现中需要根据具体需求调整


def main():
    """主函数"""
    parser = argparse.ArgumentParser(
        description="AI动画生成系统",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
示例用法:
  python main.py text2video --prompt "一只可爱的小猫" --output output/cat.mp4
  python main.py style_transfer --input input/video.mp4 --style cartoon
  python main.py video_edit --input input/video.mp4 --operations trim resize
  python main.py web_ui --port 7860
  python main.py api_server --port 8000
        """
    )
    
    subparsers = parser.add_subparsers(dest='command', help='可用命令')
    
    # 文本到动画生成
    text2video_parser = subparsers.add_parser('text2video', help='文本到动画生成')
    text2video_parser.add_argument('--prompt', required=True, help='文本描述')
    text2video_parser.add_argument('--style', default='realistic', help='生成风格')
    text2video_parser.add_argument('--duration', type=float, default=3.0, help='视频时长(秒)')
    text2video_parser.add_argument('--fps', type=int, default=24, help='帧率')
    text2video_parser.add_argument('--resolution', default='512x512', help='分辨率')
    text2video_parser.add_argument('--output', default='data/output/generated_video.mp4', help='输出路径')
    text2video_parser.set_defaults(func=text2video_command)
    
    # 风格迁移
    style_parser = subparsers.add_parser('style_transfer', help='风格迁移')
    style_parser.add_argument('--input', required=True, help='输入视频路径')
    style_parser.add_argument('--style', required=True, help='目标风格')
    style_parser.add_argument('--strength', type=float, default=0.8, help='风格强度')
    style_parser.add_argument('--output', help='输出路径')
    style_parser.set_defaults(func=style_transfer_command)
    
    # 视频编辑
    edit_parser = subparsers.add_parser('video_edit', help='视频编辑')
    edit_parser.add_argument('--input', required=True, help='输入视频路径')
    edit_parser.add_argument('--operations', nargs='+', help='编辑操作')
    edit_parser.add_argument('--start', type=float, help='开始时间(秒)')
    edit_parser.add_argument('--end', type=float, help='结束时间(秒)')
    edit_parser.add_argument('--output', help='输出路径')
    edit_parser.set_defaults(func=video_edit_command)
    
    # 批量处理
    batch_parser = subparsers.add_parser('batch_process', help='批量处理')
    batch_parser.add_argument('--input_dir', required=True, help='输入目录')
    batch_parser.add_argument('--output_dir', required=True, help='输出目录')
    batch_parser.add_argument('--style', help='应用风格')
    batch_parser.add_argument('--operations', nargs='+', help='编辑操作')
    batch_parser.set_defaults(func=batch_process_command)
    
    # Web界面
    web_parser = subparsers.add_parser('web_ui', help='启动Web界面')
    web_parser.add_argument('--host', default='0.0.0.0', help='主机地址')
    web_parser.add_argument('--port', type=int, default=7860, help='端口号')
    web_parser.add_argument('--share', action='store_true', help='分享链接')
    web_parser.add_argument('--debug', action='store_true', help='调试模式')
    web_parser.set_defaults(func=web_ui_command)
    
    # API服务器
    api_parser = subparsers.add_parser('api_server', help='启动API服务器')
    api_parser.add_argument('--host', default='0.0.0.0', help='主机地址')
    api_parser.add_argument('--port', type=int, default=8000, help='端口号')
    api_parser.add_argument('--workers', type=int, default=1, help='工作进程数')
    api_parser.add_argument('--reload', action='store_true', help='自动重载')
    api_parser.set_defaults(func=api_server_command)
    
    # 演示
    demo_parser = subparsers.add_parser('demo', help='运行演示')
    demo_parser.set_defaults(func=demo_command)
    
    # 设置
    setup_parser = subparsers.add_parser('setup', help='环境设置')
    setup_parser.set_defaults(func=lambda args: setup_directories())
    
    args = parser.parse_args()
    
    if not args.command:
        parser.print_help()
        return
    
    try:
        # 创建必要目录
        setup_directories()
        
        # 执行命令
        args.func(args)
        
    except KeyboardInterrupt:
        print("\n⚠️ 用户中断操作")
    except Exception as e:
        print(f"❌ 错误: {e}")
        if args.debug:
            import traceback
            traceback.print_exc()
        sys.exit(1)


if __name__ == "__main__":
    main() 